using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System;
using System.IO;
using MauiApp.Services;

namespace MauiApp.Services
{
    /// <summary>
    /// 基础服务类，提供共享功能如配置读取
    /// </summary>
    public abstract class BaseService
    {
        // 静态字段存储API基础地址
        private static string _apiBaseUrl;
        
        // 线程安全的锁对象
        private static readonly object _lock = new object();

        /// <summary>
        /// 获取API基础地址
        /// </summary>
        protected string ApiBaseUrl
        {
            get
            {
                if (string.IsNullOrEmpty(_apiBaseUrl))
                {
                    lock (_lock)
                    {
                        if (string.IsNullOrEmpty(_apiBaseUrl))
                        {
                            _apiBaseUrl = LoadApiBaseUrl();
                        }
                    }
                }
                return _apiBaseUrl;
            }
        }

        /// <summary>
        /// 从配置文件加载API基础地址
        /// </summary>
        /// <returns>API基础地址</returns>
        private static string LoadApiBaseUrl()
        {
            try
            {
                // 在MAUI中，使用正确的方式读取应用包内的配置文件
                using (var stream = FileSystem.OpenAppPackageFileAsync("appsettings.json").Result)
                {
                    var config = new ConfigurationBuilder()
                        .AddJsonStream(stream)
                        .Build();
                    
                    var baseUrl = config["ApiSettings:BaseUrl"];
                    
                    // 验证URL格式是否正确
                        if (!string.IsNullOrEmpty(baseUrl) && Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute))
                        {
                            LogHelper.Info($"成功从配置文件加载API基础地址: {baseUrl}");
                            return baseUrl;
                        }
                        else
                        {
                            LogHelper.Warn($"配置文件中的API基础地址无效或为空: {baseUrl}");
                            // 使用默认值
                            string defaultUrl = "http://www.hlbjkj.cn:5200/api/";
                            LogHelper.Info($"使用默认API基础地址: {defaultUrl}");
                            return defaultUrl;
                        }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"读取配置文件失败: {ex.Message}");
                LogHelper.Error($"异常详情: {ex.ToString()}");
                // 回退到默认值
                string fallbackUrl = "http://www.hlbjkj.cn:5200/api/";
                LogHelper.Info($"配置读取失败，使用回退API基础地址: {fallbackUrl}");
                return fallbackUrl;
            }
        }
        
        /// <summary>
        /// 获取临时文件夹路径
        /// </summary>
        protected string TempFolderPath
        {
            get
            {
                try
                {
                    // 在MAUI中，使用正确的方式读取应用包内的配置文件
                    using (var stream = FileSystem.OpenAppPackageFileAsync("appsettings.json").Result)
                    {
                        var config = new ConfigurationBuilder()
                            .AddJsonStream(stream)
                            .Build();
                        
                        string tempFolderPath = config["AppSettings:TempFolderPath"] ?? "TempFiles/";
                        
                        // 确保临时文件夹存在
                        string fullTempPath = Path.Combine(FileSystem.Current.AppDataDirectory, tempFolderPath);
                        if (!Directory.Exists(fullTempPath))
                        {
                            Directory.CreateDirectory(fullTempPath);
                        }
                        
                        return fullTempPath;
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error($"读取临时文件夹配置失败: {ex.Message}");
                    
                    // 如果配置读取失败，使用默认路径并确保存在
                    string defaultTempPath = Path.Combine(FileSystem.Current.AppDataDirectory, "TempFiles/");
                    if (!Directory.Exists(defaultTempPath))
                    {
                        Directory.CreateDirectory(defaultTempPath);
                    }
                    
                    return defaultTempPath;
                }
            }
        }
    }
}